import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 读取Excel文件
df = pd.read_excel('data/policy_data.xlsx')

# 输出字段名称
print('字段名称：')
print(df.columns)

# 输出前五行数据
print('\n前五行数据：')
print(df.head(5))

# 基本统计信息
print('\n基本统计信息：')
print(df.describe())

# 检查缺失值
print('\n缺失值统计：')
print(df.isnull().sum())

# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['Songti SC']
plt.rcParams['axes.unicode_minus'] = False

# 年龄分布
plt.figure(figsize=(10, 6))
# 推测可能是seaborn版本问题导致不兼容Series类型，这里将Series转为DataFrame
sns.histplot(pd.DataFrame(df['age']), x='age', bins=50, kde=True)
plt.title('客户年龄分布')
plt.xlabel('年龄')
plt.ylabel('人数')

# 性别差异
gender_renewal = df.groupby('gender')['renewal'].value_counts(normalize=True).unstack()
gender_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同性别续保情况')
plt.ylabel('比例')

plt.figure(figsize=(10, 6))
# 出生地区与投保所在地区的关联
region_cross = pd.crosstab(df['birth_region'], df['insurance_region'])
sns.heatmap(region_cross, cmap='YlGnBu', annot=False, fmt='.0f', 
    cbar_kws={'label': '人数'})
plt.title('出生地区与投保所在地区的热力图')
plt.xlabel('投保所在地区')
plt.ylabel('出生地区')

# 不同收入水平的续保情况
income_renewal = df.groupby('income_level')['renewal'].value_counts(normalize=True).unstack()
income_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同收入水平续保情况')
plt.ylabel('比例')

# 不同教育背景的续保情况
education_renewal = df.groupby('education_level')['renewal'].value_counts(normalize=True).unstack()
education_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同教育背景续保情况')
plt.ylabel('比例')

# 不同职业的续保情况
occupation_renewal = df.groupby('occupation')['renewal'].value_counts(normalize=True).unstack()
occupation_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同职业续保情况')
plt.ylabel('比例')

# 不同婚姻状况的续保情况
marital_renewal = df.groupby('marital_status')['renewal'].value_counts(normalize=True).unstack()
marital_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同婚姻状况续保情况')
plt.ylabel('比例')

# 不同家庭成员数量的续保情况
family_renewal = df.groupby('family_members')['renewal'].value_counts(normalize=True).unstack()
family_renewal.plot(kind='bar', stacked=True, figsize=(8, 6), title='不同家庭成员数量续保情况')
plt.ylabel('比例')

# 一次性展示所有图片
plt.show()

